#ifndef __EVENT_CONSUMER_H_
#define __EVENT_CONSUMER_H_

#include <COS/CosEventComm.hh>
#include <COS/CosEventChannelAdmin.hh>
#include "event.h"

/**
* Clase wrapper para un consumidor de eventos. Para hacer uso
* de esta clase hay que heredar de ella e implementar los metodos "push"
* y "disconnect_push_consumer". Las clases que heredan de esta tienen que
* llamar a su constructor.
*
* @author Carlos Rodriguez Dominguez
*/
class EventConsumer : virtual public POA_CosEventComm::PushConsumer {
public:
	/**
	* Constructor
	*
	* @param __orb Orbe de CORBA asociado al consumidor de eventos
	*/
	EventConsumer(CORBA::ORB_ptr __orb);
	
	/**
	* Destructor
	*/
	virtual ~EventConsumer();
	
	/**
	* Metodo puramente virtual a implementar en las clases que
	* hereden de esta. Este metodo es el que se ejecuta al recibir
	* un evento
	*
	* @param data Datos del evento recibido
	*/
	virtual void push(const GenericObject& data) = 0;
	
	/**
	* Metodo puramente virtual a implementar en las clases que
	* hereden de esta. Este metodo es el que se ejecuta al
	* desconectarse el consumidor de eventos
	*/
	virtual void disconnect_push_consumer() = 0;
	
protected:
	CORBA::ORB_ptr orb; /**< Puntero al orbe asociado al consumidor de eventos */
	CosEventChannelAdmin::EventChannel_var channel; /**< Canal de eventos */
	CosEventChannelAdmin::ConsumerAdmin_var consumer_admin; /**< Administrador del consumidor de eventos */
  	CosEventChannelAdmin::ProxyPushSupplier_var proxy_supplier; /**< Proxy con el emisor de eventos */

	/**
	* Se desconecta del emisor de eventos
	*/
	void disconnect_from_push_supplier();

	/**
	* Crea el consumidor de eventos
	*/
	void create_consumer();
};

#endif
